package com.example.demo.common.util;

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * @author Young
 * @date 2023/1/28 - 21:35
 * #The Midnight#
 * Redis 工具类
 */
@Component
public class RedisUtil {

    @Resource
    private RedisTemplate redisTemplate;

    /**
     * 给一个指定的 key 值附加过期时间
     * @param key
     * @param time
     * @return
     */
    public boolean expire(String key, long time){
        boolean expire = redisTemplate.expire(key, time, TimeUnit.SECONDS);
        return expire;
    }

    /**
     * 根据 key 获取过期时间
     * @param key
     * @return
     */
    public long getTimes(String key){
        long expireTimes = redisTemplate.getExpire(key, TimeUnit.SECONDS);
        return expireTimes;
    }

    /**
     * 根据 key 获取过期时间
     * @param key
     * @return
     */
    public boolean hasKey(String key){
        return redisTemplate.hasKey(key);
    }

    /**
     * 移除指定 key 的过期时间
     * @param key
     * @return
     */
    public boolean persist(String key){
        return redisTemplate.boundValueOps(key).persist();
    }

//---------------------------------------------------String类型---------------------------------

    /**
     * 根据 key 获取 value
     * @param key 键
     * @return 值
     */
    public Object get(String key){
        Object value = redisTemplate.opsForValue().get(key);
        return value;
    }

    /**
     * 将 value 放入缓存
     * @param key 键
     * @param value 值
     */
    public void set(String key, String value){
        redisTemplate.opsForValue().set(key, value);
    }

    /**
     * 将值放入缓存并设置时间
     * @param key 键
     * @param value 值
     * @param time 时间(秒) -1为无期限
     */
    public void set(String key, String value, long time){
        if(time > 0){
            redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
        } else {
          redisTemplate.opsForValue().set(key, value);
        }
    }

    /**
     * 批量添加键值对(重复的键会覆盖)
     * @param keyAndValue 键值对
     */
    public void batchSet(Map<String, String> keyAndValue){
        redisTemplate.opsForValue().multiSet(keyAndValue);
    }

    /**
     * 批量添加键值对，只有在键不存在时，才添加
     * map 中只要有一个 Key 存在，则全部不添加
     * @param keyAndValue
     */
    public void batchSetIfAbsent(Map<String, String> keyAndValue){
        redisTemplate.opsForValue().multiSetIfAbsent(keyAndValue);
    }

    /**
     * 对一个键值对的值进行加减操作
     * 如果该 key 不存在，将创建一个 key 并赋值该 number
     * 如果该 key 存在，但 value 不是长整形，将报错
     * @param key
     * @param number
     * @return
     */
    public Long increment(String key, long number){
        return redisTemplate.opsForValue().increment(key, number);
    }

    /**
     * 对一个键值对的值进行加减操作
     * 如果该 key 不存在，将创建一个 key 并赋值该 number
     * 如果该 key 存在，但 value 不是纯数字，将报错
     * @param key
     * @param number
     * @return
     */
    public Double increment(String key, double number){
        return redisTemplate.opsForValue().increment(key, number);
    }


}
